[Android] 意外と便利なGridLayout
背景
Androidエンジニアのみなさん、GridLayout使ってますか? 僕は使ったことがありません。
GridLayoutと言えば
こういうのだったり、他には電卓のようなものをイメージしていて
とりあえず仕事でもプライベートでも使うことはないかなと思ってました。
Androidweeklyを眺めていたら、海外の記事でGridLayoutの便利な使い方があったのでご紹介します。
紹介記事の要約
本家記事の要約ですが
GridLayoutがリリースされてしばらく経つけど、GridLayoutを取り巻く環境ってこんな感じだよね
Android Grid Layout
- そもそもほとんどのエンジニアがGridLayoutを知らない
- 1部の人は知ってるけどなぜか使わない
- さらに1部のエンジニアだけが使っている
だからちょっと紹介するよ!
GridLayoutは何が美味しいの?
LinearLayoutはパフォーマンスに問題があるし
RelativeLayoutは位置をうまく合わせられないし、コンポーネントが意図せずはみ出たり、重くなったりするし、うまくコントロールできないよね。
でもGridLayoutを使えば解決できるよ
といった事を簡単なテーブルを表示するレイアウトを例に説明されています。
GridLayoutを使ってみる
というわけでGridLayoutを使って簡単に設定画面っぽいものを作ってみました。
レイアウトファイルは以下のようになっています。
<?xml version="1.0" encoding="utf-8"?> <GridLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:columnCount="2" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin"> <TextView android:layout_width="0dp" android:layout_height="56dp" android:layout_columnSpan="2" android:layout_gravity="fill_horizontal" android:gravity="center_vertical" android:text="無線とネットワーク" /> <ImageView android:layout_width="32dp" android:layout_height="32dp" android:layout_margin="16dp" android:background="@mipmap/network_wifi" /> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="fill_horizontal|center_vertical" android:gravity="center_vertical" android:text="Wi-fi" /> <ImageView android:layout_width="32dp" android:layout_height="32dp" android:layout_margin="16dp" android:background="@mipmap/bluetooth" /> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="fill_horizontal|center_vertical" android:gravity="center_vertical" android:text="Bluetooth" /> <ImageView android:layout_width="32dp" android:layout_height="32dp" android:layout_margin="16dp" android:background="@mipmap/data_usage" /> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="fill_horizontal|center_vertical" android:gravity="center_vertical" android:text="データ使用量" /> <ImageView android:layout_width="32dp" android:layout_height="32dp" android:layout_margin="16dp" android:background="@mipmap/more_horizontal" /> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="fill_horizontal|center_vertical" android:gravity="center_vertical" android:text="もっと見る" /> <TextView android:layout_width="0dp" android:layout_height="56dp" android:layout_columnSpan="2" android:layout_gravity="fill_horizontal" android:gravity="center_vertical" android:text="端末" /> <ImageView android:layout_width="32dp" android:layout_height="32dp" android:layout_margin="16dp" android:background="@mipmap/brightness_medium" /> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="fill_horizontal|center_vertical" android:gravity="center_vertical" android:text="ディスプレイ" /> <ImageView android:layout_width="32dp" android:layout_height="32dp" android:layout_margin="16dp" android:background="@mipmap/notifications" /> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="fill_horizontal|center_vertical" android:gravity="center_vertical" android:text="音と通知" /> </GridLayout>
こうすればLinearLayoutの中にLinearLayoutを定義するといった煩わしい事や、RelativeLayoutでうまくコンポーネントの位置を揃えられないといった事から解放されますね。
感想
この使い方だったら今後使うことがあるかも!と思いました。
Listviewのアイテムなんかに使ったりしてもいいかもしれないですね。
参考
https://medium.com/google-developer-experts/android-grid-layout-1faf0df8d6f2#.9z6oxap22 https://design.google.com/icons/